package com.liliudong.template.biz.service.sys.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liliudong.template.biz.mapper.sys.SysDictItemMapper;
import com.liliudong.template.biz.service.sys.SysDictItemService;
import com.liliudong.template.common.convert.sys.SysDictItemConvert;
import com.liliudong.template.common.dto.sys.SysDictItemAddDTO;
import com.liliudong.template.common.dto.sys.SysDictItemModifyDTO;
import com.liliudong.template.common.dto.sys.SysDictItemPageDTO;
import com.liliudong.template.common.entity.sys.SysDictItem;
import com.liliudong.template.common.vo.PageVO;
import com.liliudong.template.common.vo.sys.SysDictItemDetailVO;
import com.liliudong.template.common.vo.sys.SysDictItemPageVO;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 系统-字典值 服务实现
 *
 * @author ldli5
 * @date 2024-07-04 14:57:53
 */
@Service
@RequiredArgsConstructor
public class SysDictItemServiceImpl extends ServiceImpl<SysDictItemMapper, SysDictItem>
		implements SysDictItemService {

	@Override
	public void addOne(SysDictItemAddDTO sysDictItemAddDTO) {
		SysDictItem sysDictItem = SysDictItemConvert.INSTANCE.addDTO2Entity(sysDictItemAddDTO);
		this.save(sysDictItem);
	}

	@Override
	public void deleteById(Long id) {
		removeById(id);
	}

	@Override
	public void modifyById(Long id, SysDictItemModifyDTO sysDictItemModifyDTO) {
		SysDictItem sysDictItem = SysDictItemConvert.INSTANCE.modifyDTO2Entity(sysDictItemModifyDTO);
		sysDictItem.setId(id);
		this.updateById(sysDictItem);
	}

	@Override
	public SysDictItemDetailVO detailById(Long id) {
		SysDictItem sysDictItem = this.getById(id);
		return SysDictItemConvert.INSTANCE.entity2DetailVO(sysDictItem);
	}

	@Override
	public PageVO<SysDictItemPageVO> queryPage(SysDictItemPageDTO sysDictItemPageDTO) {
		Long page = sysDictItemPageDTO.getPage();
		Long size = sysDictItemPageDTO.getSize();
		Page<SysDictItem> sysDictItemPage = page(
				lambdaQuery()
						.orderByDesc(SysDictItem::getUpdatedAt)
						.page(Page.of(page, size))
		);
		List<SysDictItemPageVO> pageVOS = SysDictItemConvert.INSTANCE.entityList2PageVOList(sysDictItemPage.getRecords());
		return PageVO.of(sysDictItemPage, pageVOS);
	}

	@Override
	public void saveBatchByDictId(Long dictId, List<SysDictItem> sysDictItems) {
		sysDictItems.forEach(sysDictItem -> sysDictItem.setDictId(dictId));
		this.saveBatch(sysDictItems);
	}

	@Override
	public long countByDictId(Long dictId) {
		return lambdaQuery().eq(SysDictItem::getDictId, dictId).count();
	}

	@Override
	public void removeByDictId(Long dictId) {
		remove(lambdaQuery().eq(SysDictItem::getDictId, dictId).getWrapper());
	}

	@Override
	public List<SysDictItem> listByDictId(Long dictId) {
		return lambdaQuery().eq(SysDictItem::getDictId, dictId).list();
	}

	@Override
	public Map<Long, List<SysDictItem>> listMapsByDictIds(List<Long> dictIds) {
		return lambdaQuery()
				.in(SysDictItem::getDictId, dictIds)
				.list()
				.stream()
				.collect(Collectors.groupingBy(SysDictItem::getDictId));
	}
}
